Solving 10385 - Duathlon (Ternary search)
[and.git] / 12321 - Gas Stations / 12321.cpp
blobcd4d220d2c19b36d864e5c341fe73b818bbfd408
1 using namespace std;
2 #include <algorithm>
3 #include <iostream>
4 #include <iterator>
5 #include <numeric>
6 #include <sstream>
7 #include <fstream>
8 #include <cassert>
9 #include <climits>
10 #include <cstdlib>
11 #include <cstring>
12 #include <string>
13 #include <cstdio>
14 #include <vector>
15 #include <cmath>
16 #include <queue>
17 #include <deque>
18 #include <stack>
19 #include <list>
20 #include <map>
21 #include <set>
23 #define foreach(x, v) for (typeof (v).begin() x=(v).begin(); x !=(v).end(); ++x)
24 #define For(i, a, b) for (int i=(a); i<(b); ++i)
25 #define D(x) cout << #x " is " << x << endl
27 pair<int, int> g[10001];
29 bool compare(const pair<int, int> &a, const pair<int, int> &b) {
30 if (a.first != b.first) return a.first < b.first;
31 return a.second > b.second;
34 int main(){
35 int n;
36 long long L;
37 while (scanf("%lld %d", &L, &n) == 2) {
38 if (L == 0 and n == 0) break;
40 for (int i = 0; i < n; ++i) {
41 long long x, r; scanf("%lld %lld", &x, &r);
42 g[i].first = max(0LL, x - r);
43 g[i].second = min(L, x + r);
45 sort(g, g + n, compare);
47 if (g[0].first > 0) {
48 puts("-1");
49 continue;
51 int covered = 0;
52 int ans = 0, i = 0;
53 while (i < n) {
54 ans++;
55 int best = i;
56 for (int j = i; j < n and g[j].first <= g[i].second; ++j) {
57 if (g[j].second > g[best].second) {
58 best = j;
61 covered = g[best].second;
62 if (best == i) break;
63 i = best;
65 if (covered < L) {
66 puts("-1");
67 } else {
68 assert(ans <= n);
69 printf("%d\n", n - ans);
72 return 0;